// challengeDataManager.js - 挑战数据管理工具
// 提供单例模式的挑战数据管理器
let instance = null;

// 导入存储管理器
const storageManager = require('./storageManager').getInstance();

/**
 * 挑战数据管理器类
 * 负责挑战记录、统计数据的存储、获取、更新操作
 */
class ChallengeDataManager {
  constructor() {
    // 存储键名
    this.STORAGE_KEYS = {
      CHALLENGE_RECORDS: 'userChallengeRecords',
      CHALLENGE_STATS: 'userChallengeStats'
    };
  }

  /**
   * 获取挑战数据管理器的单例实例
   * @returns {ChallengeDataManager} 挑战数据管理器实例
   */
  static getInstance() {
    if (!instance) {
      instance = new ChallengeDataManager();
    }
    return instance;
  }

  /**
   * 获取所有挑战记录
   * @returns {Array} 挑战记录数组
   */
  getChallengeRecords() {
    try {
      const records = storageManager.getStorage(this.STORAGE_KEYS.USER_CHALLENGE_RECORDS);
      return records && Array.isArray(records) ? records : [];
    } catch (error) {
      console.error('获取挑战记录失败:', error);
      return [];
    }
  }

  /**
   * 添加新的挑战记录
   * @param {Object} record - 挑战记录对象
   * @returns {boolean} 是否添加成功
   */
  addChallengeRecord(record) {
    try {
      const records = this.getChallengeRecords();
      
      // 确保记录包含必要字段
      const newRecord = {
        id: `challenge_${Date.now()}`,
        type: record.type || '',
        topic: record.topic || '',
        date: record.date || new Date().toISOString(),
        isWin: record.isWin !== undefined ? record.isWin : false,
        score: record.score || 0,
        duration: record.duration || 0
      };
      
      // 添加到记录列表开头
      records.unshift(newRecord);
      
      // 限制记录数量，只保留最近3条
      if (records.length > 3) {
        records.splice(3);
      }
      
      storageManager.setStorage(this.STORAGE_KEYS.USER_CHALLENGE_RECORDS, records);
      
      // 同步更新统计数据
      this.updateChallengeStats();
      
      return true;
    } catch (error) {
      console.error('添加挑战记录失败:', error);
      return false;
    }
  }

  /**
   * 获取挑战统计数据
   * @returns {Object} 统计数据对象
   */
  getChallengeStats() {
    try {
      const stats = storageManager.getStorage(this.STORAGE_KEYS.USER_CHALLENGE_STATS);
      
      // 如果没有统计数据，初始化并返回默认值
      if (!stats) {
        const defaultStats = this._getDefaultStats();
        storageManager.setStorage(this.STORAGE_KEYS.USER_CHALLENGE_STATS, defaultStats);
        return defaultStats;
      }
      
      return stats;
    } catch (error) {
      console.error('获取挑战统计失败:', error);
      return this._getDefaultStats();
    }
  }

  /**
   * 更新挑战统计数据
   * @returns {boolean} 是否更新成功
   */
  updateChallengeStats() {
    try {
      const records = this.getChallengeRecords();
      
      if (records.length === 0) {
        return false;
      }
      
      // 计算总挑战次数
      const totalChallenges = records.length;
      
      // 计算胜率
      const winCount = records.filter(record => record.isWin).length;
      const winRate = totalChallenges > 0 ? Math.round((winCount / totalChallenges) * 100) : 0;
      
      // 计算平均得分
      const totalScore = records.reduce((sum, record) => sum + record.score, 0);
      const avgScore = totalChallenges > 0 ? Math.round(totalScore / totalChallenges) : 0;
      
      // 计算各类挑战的次数
      const challengeTypes = {};
      records.forEach(record => {
        challengeTypes[record.type] = (challengeTypes[record.type] || 0) + 1;
      });
      
      // 构建统计数据
      const stats = {
        totalChallenges,
        winRate,
        avgScore,
        challengeTypes,
        updateTime: new Date().toISOString()
      };
      
      storageManager.setStorage(this.STORAGE_KEYS.USER_CHALLENGE_STATS, stats);
      return true;
    } catch (error) {
      console.error('更新挑战统计失败:', error);
      return false;
    }
  }

  /**
   * 获取最近的挑战记录
   * @param {number} count - 要获取的记录数量
   * @returns {Array} 最近的挑战记录数组
   */
  getRecentChallengeRecords(count = 5) {
    const records = this.getChallengeRecords();
    return records.slice(0, count);
  }

  /**
   * 获取默认统计数据
   * @private
   * @returns {Object} 默认统计数据
   */
  _getDefaultStats() {
    return {
      totalChallenges: 0,
      winRate: 0,
      avgScore: 0,
      challengeTypes: {},
      updateTime: new Date().toISOString()
    };
  }

  /**
   * 清空所有挑战数据
   * @returns {boolean} 是否清空成功
   */
  clearAllChallengeData() {
    try {
      storageManager.removeStorage(this.STORAGE_KEYS.USER_CHALLENGE_RECORDS);
      storageManager.removeStorage(this.STORAGE_KEYS.USER_CHALLENGE_STATS);
      return true;
    } catch (error) {
      console.error('清空挑战数据失败:', error);
      return false;
    }
  }
}

// 导出类和单例实例
module.exports = {
  ChallengeDataManager,
  getInstance: ChallengeDataManager.getInstance,
  // 直接导出单例实例
  getInstance: ChallengeDataManager.getInstance
};

// 同时设置默认导出为单例实例
module.exports.default = ChallengeDataManager.getInstance();